#include<bits/stdc++.h>
#include "graph.h"
using namespace std;
vector<pair<int, int> > t[505];
pair<int, int> fa[505];
int out[505];
void ans(int D, int A){
    Answer(D,A);
}
void run(int I, int c){
    Move(I, c);
}
int du(){
    return NumberOfRoads();
}
int pre(){
    return LastRoad();
}
int col(){
    return Color();
}
int cnt;
int bh[505][505];
vector<int> graph[505];
int f[505][505];
bitset<505>bit[505];
int go[505][505];
void dfs(int now){
    out[now] = du();
    for(int i = 1; i <= out[now]; i++){
        run(i, 2);
        if(col() == 1){
            int son = cnt + 1;
            t[now].emplace_back(++cnt, i);
            bh[now][cnt] = i;
            fa[cnt] = {now, pre()};
            bh[cnt][now] = pre();
            graph[now].emplace_back(cnt);
            graph[cnt].emplace_back(now);
            go[now][i] = cnt;
            dfs(cnt);
            run(bh[son][now], 2);
        }else{
            if(i == fa[now].second){
                run(pre(), 2);
                continue;
            }
            bit[now][i] = 1;
            run(pre(), 2);
        }
    }
}
int qwq[505];
void dfs_(int now){
    for(int i = 1; i <= out[now]; i++){
        run(i, 1);
        if(col() == 2){
            dfs_(go[now][i]);
            run(bh[go[now][i]][now], 1);
        }else{
            run(pre(), 1);
        }
    }
    if(bit[now].count() == 0){
        return;
    }
    for(int j = bit[now]._Find_first(); j != bit[now].size(); j = bit[now]._Find_next(j)){
        run(j, 1);
        qwq[pre()]++;
        run(pre(), 1);
    }
    run(fa[now].second, 3);
    int nnw = now;
    vector<int>vec;
    vec.emplace_back(now);
    now = fa[now].first;
    while(now){
        for(int j = bit[now]._Find_first(); j != bit[now].size(); j = bit[now]._Find_next(j)){
            if(!qwq[j])continue;
            run(j, 1);
            if(col() == 3){
                graph[now].emplace_back(nnw);
                graph[nnw].emplace_back(now);
                qwq[j]--;
                bit[now][j] = 0;
                run(pre(), 3);
            }else{
                run(pre(), col());
            }
        }
        if(!fa[now].second)break;
        vec.emplace_back(now);
        run(fa[now].second, 1);
        now = fa[now].first;
    }
    for(int i = vec.size() - 1; i >= 0; i--){
        run(bh[now][vec[i]], 1);
        now = vec[i];
    }
    run(1, 1);
    run(pre(), 1);
}
int num[505];
void Inspect(int R){
    cnt = 1;
    dfs(1);
    dfs_(1);
    int n = cnt;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            f[i][j] = 1e9;
        }
    }
    for(int i = 1; i <= n; i++)f[i][i] = 0;
    for(int i = 1; i <= n; i++){
        for(auto to : graph[i]){
            f[i][to] = 1;
        }
    }
    for(int k = 1; k <= n; k++){
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++){
                f[i][j] = min(f[i][k] + f[k][j], f[i][j]);
            }
        }
    }
    for(int i = 1; i <= n; i++){
        for(int j = i + 1; j <= n; j++){
            num[f[i][j]]++;
        }
    }
    for(int i = 1; i <= R; i++)ans(i, num[i]);
    return;
}